mediapipe/mediapipe/objc/Weakify.h
MediaPipe Team 294687295d Project import generated by Copybara.
PiperOrigin-RevId: 263889205
2019-08-16 18:56:48 -07:00

55 lines
2.2 KiB
C

// Copyright 2019 The MediaPipe Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// OBJC_LINTER
// TODO: check license. This was forked from an internal header.
/**
* __WEAKNAME_ is a private macro used to generate a local variable name related
* to the argument variable name. This generated local variable name is
* intentionally stable across multiple invocations.
*/
#define __WEAKNAME_(variable) variable##_weak_
/**
* WEAKIFY defines a new local variable that is a weak reference to the argument
* variable.
*
* This macro is generally used to capture a weak reference to be captured by an
* Objective-C block to avoid unintentionally extending an object's lifetime or
* avoid causing a retain cycle.
*
* The new local variable's name will be based on the name of the target
* variable and is stable across multiple invocations of WEAKIFY. In general,
* you should not need to invoke WEAKIFY multiple times on the same variable.
*/
#define WEAKIFY(variable) \
__weak __typeof__(variable) __WEAKNAME_(variable) = (variable)
/**
* STRONGIFY defines a new shadow local variable with the same name as the
* argument variable and initialize it with a resolved weak reference based on a
* weak reference created previously using the WEAKIFY macro.
*
* @note:
* This macro must be called within each block scope to prevent nested blocks
* from capturing a strong reference from an outer block.
*/
#define STRONGIFY(variable) \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wshadow\"") \
__strong __typeof__(variable) variable = \
__WEAKNAME_(variable) _Pragma("clang diagnostic pop")