Will dealloc(下面)释放NSString静态变量指向的exampleString?
// ExampleClass.h
@interface ExampleClass : NSObject
@end
// ExampleClass.m
static NSString *exampleString;
@implementation ExampleClass
- (void)dealloc {
exampleString = nil;
}
- (id)init {
self = [super init];
if (self) {
exampleString = [NSString stringWithFormat:@"example %@", @"format"];
}
return self;
}
@end
Run Code Online (Sandbox Code Playgroud) 我有2个选择:
单身模式
class Singleton{
private static Singleton singleton = null;
public static synchronized Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
Run Code Online (Sandbox Code Playgroud)使用一个static final字段
private static final Singleton singleton = new Singleton();
public static Singleton getSingleton() {
return singleton;
}
Run Code Online (Sandbox Code Playgroud)有什么不同?(单线程或多线程)
更新:我知道Bill Pugh或enum方法.我不是在寻找正确的方法,但我只使用过1.在1或2中是否有任何差异?
我试图创建一个静态变量来存储图像字典.不幸的是,我可以找到初始化它的最好方法是检入使用该变量的每个函数.由于我在一个类别中创建了这个变量,我不能只在初始化器中初始化它.有没有更简洁的初始化navigationBarImages的方法?
static NSMutableDictionary *navigationBarImages = NULL;
@implementation UINavigationBar(CustomImage)
//Overrider to draw a custom image
- (void)drawRect:(CGRect)rect
{
if(navigationBarImages==NULL){
navigationBarImages=[[NSMutableDictionary alloc] init];
}
NSString *imageName=[navigationBarImages objectForKey:self];
if (imageName==nil) {
imageName=@"header_bg.png";
}
UIImage *image = [UIImage imageNamed: imageName];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
//Allow the setting of an image for the navigation bar
- (void)setImage:(UIImage*)image
{
if(navigationBarImages==NULL){
navigationBarImages=[[NSMutableDictionary alloc] init];
}
[navigationBarImages setObject:image forKey:self];
}
@end
Run Code Online (Sandbox Code Playgroud) 在我的.m文件中,我有一个名为Ad的类,我有3个静态字符串
static NSString *AdStateDisabled = @"disable";
static NSString *AdStateExpired = @"expired";
static NSString *AdStateActive = @"active";
Run Code Online (Sandbox Code Playgroud)
我可以简单地在当前类中使用这些静态变量,但我不能从任何其他类调用它们,有没有办法使这些静态变量全局化?所以例如在我的viewcontroller类中我可以做类似的事情.
//HomeViewController.m
if ([self.ad.state isEqual:Ad.AdStateDisabled])
{
//do something
}
Run Code Online (Sandbox Code Playgroud) 我理解与应用程序(控制台/窗口)相关的静态变量的生命周期,但我不确定我是否在Web应用程序(asp.net,mvc,web api等)的上下文中理解它们的生命周期.
根据我的理解,当IIS回收应用程序池时,静态变量会重置为其类型的默认值(积分= 0,引用类型= null等),但我想知道内联初始化程序是否在回收后重新初始化,或者是类型默认值总是可以分配?
例子):
// example 1
static class StaticRandom
{
private static Random rng = new Random();
}
Run Code Online (Sandbox Code Playgroud)
在上面,当循环后第一次调用时,是否会将静态字段rng重新初始化为新的Random()?或者在尝试使用变量之前是否需要实现空检查,例如:
// example 2
static class StaticRandom
{
private static Random rng = null;
public static Next()
{
if (rng == null)
rng = new Random();
return rng.Next();
}
}
Run Code Online (Sandbox Code Playgroud)
我是否正确假设在IIS回收后,示例1中的rng变量将为null,直到重新初始化为例如示例2?
注意:我完全了解上面示例中的线程安全问题,这只是一个简单的例子来说明我的问题.在上述想法的真实场景中,我将实现适当的锁定模式.
我知道这个问题已经被问过很多次了,但这似乎是一个略有不同的变化,我无法弄清楚。
考虑以下代码:
#include <cstdio>
struct TestValue;
inline const TestValue* v_ptr = nullptr;
struct TestValue {
static const TestValue v1;
TestValue() {
v_ptr = this;
printf("TestValue Initialized at %p\n", this);
}
};
struct CallTest {
CallTest() {
printf("CallTest Initalized at %p\n", this);
printf("v_ptr = %p\n", v_ptr);
}
};
const inline TestValue TestValue::v1{};
const inline CallTest ct{};
int main() {}
Run Code Online (Sandbox Code Playgroud)
我使用的是 C++17 或更高版本,它增加了对外部静态初始化内联变量的支持。我试图理解使用内联说明符“out of line”时围绕初始化顺序的保证。请注意, v1被声明为 TestValue 的静态变量,然后稍后但在 之前内联定义ct。令人惊讶的是(至少对我来说),使用 Clang 14.0.3,程序打印:
CallTest Initalized at 0x404059
v_ptr = (nil)
TestValue …Run Code Online (Sandbox Code Playgroud) c++ inline static-variables initialization-order inline-variable
我有一个BroadcastReceiver类.我声明了一些静态变量,其值在onReceive()方法中更新.根据我的知识,静态变量将保持它在onReceive调用中的值.有没有可能我会松开这些值(就像我的类将被卸载重置静态变量)?这些基本上是我需要为多个onReceive调用提供的一些临时变量.
android garbage-collection static-variables broadcastreceiver
这是我想要完成的简化版本:
在我的脚本中,我希望每次执行脚本时都会更改true和false的变量.
<?php
static $bool = true;
// Print differente messages depending on $bool
if( $bool == true )
echo "It's true!";
else
echo "It's false!";
// Change $bools value
if( $bool == true )
$bool = false
else
$bool = true;
?>
Run Code Online (Sandbox Code Playgroud)
但显然我正在做的事情是错的.变量$bool是不断的true,我还没有完全掌握我认为的静态变量的概念.我究竟做错了什么?
代码如下:
#include <stdlib.h>
int num = 3; // Static external variable
int *ptr = #
int main(void)
{
int num2 = 4; // Automatic variable
int *ptr2 = &num2;
free(ptr); //Free static variable
free(ptr2); //Free automatic variable
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我尝试编译上面的代码,它的工作原理,我很好奇free()功能是否能够释放静态变量和自动变量?或者基本上什么也没做?
不确定我是否完全理解我在这里找到的类似问题的答案,所以要绝对确定:
我想在函数中有一个局部变量,只初始化一次(类似于 C、C++ 等强类型语言中的静态变量)。
当然,我可以全局声明它,但将它放在该函数的范围内似乎更好,因为它不会在其他任何地方使用。
现在,这就是我要做的:
function func(data) {
func.PARAMS = [
{"name": "from", "size": 160, "indexed": true},
{"name": "input", "size": 256, "indexed": false},
{"name": "output", "size": 256, "indexed": false},
];
...
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,func.PARAMS确实只会初始化一次,还是每次调用函数时都会初始化?
根据我找到的一些答案(例如这个答案),我需要在初始化之前使用以下内容:
if (typeof func.PARAMS == 'undefined')
Run Code Online (Sandbox Code Playgroud)
当然,这种“补充”在强类型语言中是无关紧要的,所以我只想确保它是绝对必要的,以确保“静态行为”(即,一次性初始化)。
static-variables ×10
objective-c ×3
.net ×1
android ×1
asp.net ×1
c ×1
c# ×1
c++ ×1
categories ×1
free ×1
iis ×1
inline ×1
iphone ×1
java ×1
javascript ×1
php ×1
scope ×1
singleton ×1
static ×1