我正在尝试创建一个游戏,以便我可以更改其数据并将其保存回来.我在评论行上得到两个错误.为什么我会收到这些错误.我分配了游戏,所以我应该将其正确发布.这是我保存游戏的代码
Game *newGame = [[Game alloc] init];//error 1
newGame = [gamesArray objectAtIndex:gameNumber];
[newGame setTheShotArray:shotArray];
[gamesArray replaceObjectAtIndex:gameNumber withObject:newGame];
NSString *path = [self findGamesPath];
[NSKeyedArchiver archiveRootObject:gamesArray toFile:path];
[newGame release];//error 2
Run Code Online (Sandbox Code Playgroud)
我得到错误1,表示在初始化期间存储到'newGame'的值永远不会被读取.
第二个错误说明调用者此时不拥有的对象的引用计数的不正确的减少.
这是什么意思?请不要告诉我,你需要阅读内存管理,并给我一个链接.请告诉我如何解决问题.
一个哲学问题,各种各样.将常量字符串分配给(保留)的@property是否合适?或者,我应该这样做self.string = [NSString stringWithString:@""];
有内存泄漏吗?如果它被过度释放怎么办?
它是一个常量字符串,它的行为方式与NSString对象相同吗?
如果属性是(assign),那意味着它在运行循环后无效吗?
这是我第一次在Stack Overflow上发帖,所以希望我做的一切正常,你们可以提供帮助.
我想知道在C#中是否有一种方法来访问属于类的静态变量,只给出类的类型.例如:
public class Foo
{
public static int bar = 0;
}
public class Main
{
public void myFunc(Type givenType)
{
int tempInt = ??? // Get the value of the variable "bar" from "Foo"
Debug.WriteLine("Bar is currently :" + tempInt);
}
}
// I didn't run this code through a compiler, but its simple enough
// that hopefully you should get the idea...
Run Code Online (Sandbox Code Playgroud)
很难描述需要知道这一点的背景,但我正在XNA中制作游戏,我正在尝试使用引用计数来降低设计的复杂性.我在游戏和强化中有对象可以应用它们(留在对象上).上电可能会死亡,但它们的影响仍然可以在物体上停留,我需要跟踪上电中是否有任何影响仍在物体上停留(因此,引用计数).我打算用一个静态整数制作一个"PowerUpEffect"类(对于每种类型的加电),保存仍然受其影响的对象数量,但是传递PowerUpEffect时游戏其余部分的设计效果不佳一直到对象,它调用PowerUpEffect类的方法.
我希望只传递PowerUpEffect的类型(使用类似"typeOf()"的东西)并使用该类型来引用属于这些类型的静态变量,但我不知道如何做或者甚至可能.
我很高兴甚至找到不能直接回答这些问题的解决方案,而是通过简单而优雅的设计解决问题.=)
救命!(谢谢!)
我正在努力摆脱短串.目前在我们的计划中使用的很多地方之一是记录.这些记录很多都保存在AVL树中.
使用的AVL树是一个通用树ElemSize,它包含一个指向多个字节()的指针,这些字节到目前为止运行良好.AVL树中每个记录的内存分配GetMem和复制Move.但是,如果string是指向引用计数结构的指针,则将内存复制回记录不再有效,因为引用的sting经常被释放(通过引用计数自动).只有一个指针和"数据块"的大小,我认为不可能增加字符串的引用计数.
我正在寻找一种方法来获取在AVL树中存储记录时要考虑的叮咬的引用计数.
我可以将记录类型传递给树构造函数,然后将指针强制转换为此类型,从而增加引用吗?或者类似的修复,我可以将更改隔离到主要在AVL单元中并调用它的构造函数.
用于分配存储AVL记录的空间的当前代码; XData是指向要存储的记录的指针:
New(RootPtr); { create new memory space }
GetMem(RootPtr^.TreeData, ElemSize);
WITH RootPtr^ DO BEGIN
{ copy data }
Move(XData^, RootPtr^.TreeData^, ElemSize);
Run Code Online (Sandbox Code Playgroud) 这是一个例子:
use std::rc::Rc;
#[derive(PartialEq, Eq)]
struct MyId;
pub fn main() {
let rc_a_0 = Rc::new(MyId);
let rc_a_1 = rc_a_0.clone();
let rc_b_0 = Rc::new(MyId);
let rc_b_1 = rc_b_0.clone();
println!("rc_a_0 == rc_a_1: {:?}", rc_a_0 == rc_a_1);
println!("rc_a_0 == rc_b_0: {:?}", rc_a_0 == rc_b_0);
}
Run Code Online (Sandbox Code Playgroud)
两者都println!在印刷之上true.有没有办法区分rc_a_*和rc_b_*指针?
考虑以下简单的引用计数函数(与 一起使用boost::intrusive_ptr):
class Foo {\n // ...\n\n std::atomic<std::size_t> refCount_{0};\n\n friend void intrusive_ptr_add_ref(Foo* ptr)\n {\n ++ptr->refCount_; // \xe2\x9d\xb6\n }\n\n friend void intrusive_ptr_release(Foo* ptr)\n {\n if (--ptr->refCount_ == 0) { // \xe2\x9d\xb7\n delete ptr;\n }\n }\n};\nRun Code Online (Sandbox Code Playgroud)\n\n我仍在学习内存排序,我想知道在这种情况下fetch_add/sub( memory_order_seq_cst) 的默认内存排序是否太严格。由于我想确保的唯一顺序是在 \xe2\x9d\xb6 和 \xe2\x9d\xb7 之间,我认为我们可以将 \xe2\x9d\xb6 替换为
ptr->refCount_.fetch_add(1, std::memory_order_release);\nRun Code Online (Sandbox Code Playgroud)\n\n和 \xe2\x9d\xb7 与
\n\nif (ptr->refCount_.fetch_sub(1, std::memory_order_consume) == 1) {\nRun Code Online (Sandbox Code Playgroud)\n\n但内存排序对我来说仍然是新的和微妙的,所以我不确定这是否能正常工作。我错过了什么吗?
\nc++ multithreading reference-counting memory-model stdatomic
我有一个Rc<Option<T>>但需要得到Rc<T>它.就像是:
let rc_option: Rc<Option<T>> = Rc::new(Ok(value));
let ok_value: Rc<T> = rc_option.map(|option| option.unwrap());
Run Code Online (Sandbox Code Playgroud)
这甚至可以远程实现吗?它看起来像是有意义的东西,因为它Rc可以在内部为新的映射值递增计数器,但我找不到任何文档.
我正在生成一个线程,该线程构建本质上是一棵树,稍后需要它,因此可以在线程外进行计算。举个例子,考虑一个Foo { inner: HashMap<Bar, Rc<FooBar>> }. 线程的闭包不会捕获周围环境中的任何内容。
问题在于,它Rc构成了整个类型!Send。这会阻止Foo返回到生成线程。有效地,Rc“毒药” Foo。
我不明白为什么由生成的线程创建并返回的类型仍然需要是Send:它强制所有内部类型(在本例中是Rcin the HashMap、 in Foo、 to be Send)。从它强制生成的线程始终使用原子计数,而实际上两个线程同时访问引用计数器的可能性为零。
Rc有没有办法从线程返回(而不是共享!)包含 an 的类型?我是否遗漏了一些理解Send?
我正在阅读 Rust Book,所有内容都很容易理解(感谢这本书的作者),直到关于生命周期的部分。我花了一整天,阅读了很多关于生命的文章,但我仍然对正确使用它们感到非常不安。
不过,我确实理解的是,显式生命周期说明符的概念旨在解决悬空引用的问题。我也知道 Rust 有引用计数智能指针 ( Rc),我相信它与shared_ptrC++ 中的相同,具有相同的目的:防止悬空引用。
鉴于这些生命周期对我来说是如此可怕,而且智能指针对我来说非常熟悉和舒适(我在 C++ 中经常使用它们),我可以避免使用智能指针的生命周期吗?还是生命周期是我必须在 Rust 代码中理解和使用的不可避免的事情?
为什么这段代码会在第 7 行出现恐慌?foo_unwrapped 不应该是第 5 行的 Some(3) 而不是 None?
use std::rc::Rc;
fn main()
{
let foo: Rc<i32> = Rc::new(3);
let mut foo_cloned = Rc::clone(&foo);
let mut foo_unwrapped = Rc::get_mut(&mut foo_cloned).unwrap();
foo_unwrapped = &mut 42;
}
Run Code Online (Sandbox Code Playgroud) rust ×5
borrowing ×1
c# ×1
c++ ×1
delphi ×1
delphi-2007 ×1
identity ×1
lifetime ×1
memory-leaks ×1
memory-model ×1
objective-c ×1
panic ×1
record ×1
reference ×1
retaincount ×1
stdatomic ×1
xcode ×1
xna ×1